﻿using System;
using System.Collections.Generic;

namespace RiskCalc.Modelo
{
    public class Carteira
    {
        // Ações da carteira
        public List<Acao> vetAcao;

        private double[,] matrizCorrelacao;
        private double[,] matrizCovariancia;
        private double varParametrico;

        #region Singleton

        private static Carteira instancia;

        public static Carteira getInstance()
        {
            if (instancia == null)
            {
                instancia = new Carteira();
            }
            return instancia;
        }

        protected Carteira()
        {
            this.vetAcao = new List<Acao>();
        }

        #endregion

        public void calcularVarParametrico(int confianca)
        {
            // Monta matriz de uma linha (vetor) de VaRs de cada ação
            double[,] vetVars = new double[1,vetAcao.Count];

            for(int i=0 ; i< vetAcao.Count ; i++)
            {
                vetVars[1,i] = vetAcao[i].VarParametrico;
            }

            this.varParametrico = Calculos.varParametricoCarteira(vetVars, matrizCorrelacao);
        }

        public void calcularMatrizCorrelacao()
        {
            this.matrizCorrelacao = new double[vetAcao.Count, vetAcao.Count];

            for (int i = 0; i < vetAcao.Count; i++)
            {
                for (int j = 0; j < vetAcao.Count; j++)
                {
                    this.matrizCorrelacao[i,j] =
                        Calculos.correlacao(

                                Calculos.covariancia(
                                    this.vetAcao[i].VetDados.ConvertAll(new Converter<Dado, double>(Dado.DadoParaRetornoGeometrico)),
                                    this.vetAcao[i].Media,
                                    this.vetAcao[j].VetDados.ConvertAll(new Converter<Dado, double>(Dado.DadoParaRetornoGeometrico)),
                                    this.vetAcao[j].Media),

                        this.vetAcao[i].DesvioPadrao,
                        this.vetAcao[j].DesvioPadrao);
                }
            }
        }

        public bool carregarDados(out string msgRetorno)
        {
            return Persistencia.Persistencia.carregarDadosDoBanco(this, out msgRetorno);
        }

        public bool gravarDados(out string msgRetorno)
        {
            return Persistencia.Persistencia.imprimirNoExcel(this, out msgRetorno, true);
        }
    }
}
